27.1.5 静态内容
默认情况下,Spring Boot从classpath下的/static
(/public
,/resources
或/META-INF/resources
)文件夹,或从ServletContext
根目录提供静态内容。这是通过Spring MVC的ResourceHttpRequestHandler
实现的,你可以自定义WebMvcConfigurerAdapter
并覆写addResourceHandlers
方法来改变该行为(加载静态文件)。
在单机web应用中,容器会启动默认的servlet,并用它加载ServletContext
根目录下的内容以响应那些Spring不处理的请求。大多数情况下这都不会发生(除非你修改默认的MVC配置),因为Spring总能够通过DispatcherServlet
处理这些请求。
你可以设置spring.resources.staticLocations
属性自定义静态资源的位置(配置一系列目录位置代替默认的值),如果你这样做,默认的欢迎页面将从自定义位置加载,所以只要这些路径中的任何地方有一个index.html
,它都会成为应用的主页。
此外,除了上述标准的静态资源位置,有个例外情况是Webjars内容。任何在/webjars/**
路径下的资源都将从jar文件中提供,只要它们以Webjars的格式打包。
注 如果你的应用将被打包成jar,那就不要使用src/main/webapp
文件夹。尽管该文件夹是通常的标准格式,但它仅在打包成war的情况下起作用,在打包成jar时,多数构建工具都会默认忽略它。
Spring Boot也支持Spring MVC提供的高级资源处理特性,可用于清除缓存的静态资源或对WebJar使用版本无感知的URLs。
如果想使用针对WebJars版本无感知的URLs(version agnostic),只需要添加webjars-locator
依赖,然后声明你的Webjar。以jQuery为例,"/webjars/jquery/dist/jquery.min.js"
实际为"/webjars/jquery/x.y.z/dist/jquery.min.js"
,x.y.z
为Webjar的版本。
注 如果使用JBoss,你需要声明webjars-locator-jboss-vfs
依赖而不是webjars-locator
,否则所有的Webjars将解析为404
。
以下的配置为所有的静态资源提供一种缓存清除(cache busting)方案,实际上是将内容hash添加到URLs中,比如<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
注 实现该功能的是ResourceUrlEncodingFilter
,它在模板运行期会重写资源链接,Thymeleaf,Velocity和FreeMarker会自动配置该filter,JSP需要手动配置。其他模板引擎还没自动支持,不过你可以使用ResourceUrlProvider自定义模块宏或帮助类。
当使用比如JavaScript模块加载器动态加载资源时,重命名文件是不行的,这也是提供其他策略并能结合使用的原因。下面是一个"fixed"策略,在URL中添加一个静态version字符串而不需要改变文件名:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12
使用以上策略,JavaScript模块加载器加载"/js/lib/"
下的文件时会使用一个固定的版本策略"/v12/js/lib/mymodule.js"
,其他资源仍旧使用内容hash的方式<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
。查看ResourceProperties获取更多支持的选项。